package com.wcity.manage.service.impl;

import com.wcity.manage.common.utils.Log;
import com.wcity.manage.common.utils.StringUtil;
import com.wcity.manage.dao.mapper.ModuleManageMapper;
import com.wcity.manage.dao.mapper.ModuleMapper;
import com.wcity.manage.dao.mapper.UserModuleMapper;
import com.wcity.manage.dao.model.Module;
import com.wcity.manage.dao.model.ModuleManage;
import com.wcity.manage.dao.model.UserModule;
import com.wcity.manage.service.ModuleService;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;

/**
 * Created by jn on 2016/12/8.
 *
 */
@Service
public class ModuleServiceImpl implements ModuleService {


    @Override
    public String addModule(Module module) {

        try {
            if ( moduleMapper.insert( module ) <= 0 ) return "新增模块失败";
        } catch (DataAccessException e) {
            Log.error( "addModule error, {}", e.getMessage(), e );
            return "数据库异常";
        }

        return "";
    }

    @Override
    public String editModule(Module module) {

        try {
            if ( moduleMapper.update( module ) <= 0 ) return "修改模块失败";
        } catch (DataAccessException e) {
            Log.error( "editModule error, {}", e.getMessage(), e );
            return "数据库异常";
        }

        return "";
    }

    @Override
    public String editUserModule(UserModule module) {

        UserModule find = userModuleMapper.find( module.getId() );

        // 父级模块普通管理员不允许修改名称
        if ( find.getModule().getParentId() == 0 ) module.setName( "" );

        try {
            if ( userModuleMapper.update( module ) <= 0 ) return "修改失败";
        } catch (DataAccessException e) {
            Log.error( "editUserModule error, {}", e.getMessage(), e );
            return "数据库异常";
        }

        return "";
    }

    @Override
    @Transactional
    public String addModuleManage(ModuleManage manage,String moduleIds) {

        if ( manageMapper.findByUserId( manage.getUserId() ) != null ) return "已经存在";

        try {
            if ( manageMapper.insert( manage ) <= 0 ) return "添加失败";

            // 模块分配
            String msg = allocateModule( manage.getUserId(), moduleIds );

            if ( !StringUtil.isBlank( msg ) ) return msg;

        } catch (DataAccessException e) {
            Log.error( "addModuleManage error, {}", e.getMessage(), e );
            return "数据库异常";
        }

        return "";
    }

    @Override
    @Transactional
    public String editModuleManage(ModuleManage manage,String moduleIds) {

        try {
            if ( manageMapper.update( manage ) <= 0 ) return "添加失败";

            // 模块分配
            String msg = allocateModule( manage.getUserId(), moduleIds );

            if ( !StringUtil.isBlank( msg ) ) return msg;

        } catch (DataAccessException e) {
            Log.error( "editModuleManage error, {}", e.getMessage(), e );
            return "数据库异常";
        }

        return "";
    }

    @Override
    @Transactional
    public String allocateModule(int userId, String moduleIds) {

        if ( StringUtil.isBlank( moduleIds ) ) return "至少选择一个模块";

        String[] moduleArray = moduleIds.split(",");

        if ( moduleArray.length <= 0 ) return "至少选择一个模块";

        List<String> ids = Arrays.asList( moduleArray );

        // 用户已有模块
        List<Integer> haveIds = userModuleMapper.findUserModuleIds( userId );

        for ( Integer delId : haveIds ) {
            // 删除没有的模块
            if ( !ids.contains( String.valueOf( delId ) ) ) userModuleMapper.deleteByModule( userId, delId );

        }

        for ( String id : ids ) {

            // 已有模块则跳过
            if ( haveIds.contains( Integer.parseInt( id ) ) ) continue;

            UserModule userModule = new UserModule();
            userModule.setUserId( userId );
            userModule.setName( moduleMapper.findName( Integer.parseInt( id ) ) );
            userModule.setSort( 0 );
            userModule.setStatus( 1 );
            userModule.setModuleId( Integer.parseInt( id ) );

            userModuleMapper.insert( userModule );

        }

        return "";
    }

    /**
     * 首先判断模块本身是否被超级管理员下线，然后再判断用户自定义上下线功能
     * @param userId
     * @return
     */
    @Override
    public Object moduleList(int userId) {

        ModuleManage manage = manageMapper.findByUserId( userId );
        if ( manage == null ) return "用户不存在";
        if ( manage.getStatus() != 1 ) return "项目已下线";

        List<UserModule> authModules = userModuleMapper.findUserModule( userId );

        Map<String,Object> result = new HashMap<>();
        List<Object> parentList = new ArrayList<>();
        List<Object> childrenList = new ArrayList<>();

        // 下线父模块id
        List<Integer> offlineModuleId = new ArrayList<>();

        for ( UserModule module : authModules ) {

            // 父级模块id
            int parentId = module.getModule().getParentId();
            // 用户模块
            Module m = module.getModule();

            // 顶级模块
            if ( parentId == 0 ) {

                // 父级模块下线
                if ( m.getStatus() != 1 ) {
                    offlineModuleId.add( m.getId() );
                    continue;
                }
                // 用户自定义上下线功能
                if ( module.getStatus() != 1 ) {
                    offlineModuleId.add( m.getId() );
                    continue;
                }

                Map<String,Object> map = new HashMap<>();
                // 父级模块名称
                map.put("moduleName",m.getName());
                map.put("moduleId",m.getId());

                parentList.add( map );

            } else {

                // 子模块下线
                // 如果父级模块已经下线，则子模块也不能显示
                if ( m.getStatus() != 1 || offlineModuleId.contains( parentId ) ) continue;

                // 用户自定义上下线功能
                if ( module.getStatus() != 1 ) continue;

                // 子模块
                Map<String,Object> map = new HashMap<>();
                // 使用自定义名称
                map.put("moduleName",module.getName());
                map.put("moduleUrl",m.getId());
                // 父模块id
                map.put("parentId",m.getParentId());
                map.put("moduleLogo",m.getLogo());

                childrenList.add( map );
            }

        }

        result.put("parentList",parentList);
        result.put("children",childrenList);

        return result;
    }

    @Resource private ModuleMapper moduleMapper;
    @Resource private UserModuleMapper userModuleMapper;
    @Resource private ModuleManageMapper manageMapper;
}
